<?php
namespace app\admin\controller;

use think\facade\View;
use app\Request;
use think\Controller;
use think\Db;
use think\facade\Session;
use app\common\Backup;

class Database extends ViewBaseController
{
    public function index()
    {
        $db= new Backup();
        return View::fetch('index',['list'=>$db->dataList()]);
    }

    /***
     * @return string
     * @Author Vee7
     * @Date 2021/12/22
     * @Time 12:49
     * @Description 备份文件列表
     */
    public function importlist()
    {
        $db= new Backup();
        return View::fetch('importlist',['list'=>$db->fileList()]);
    }

    /***
     * @param int $time
     * @param null $part
     * @param null $start
     * @return string|\think\response\Json
     * @Author Vee7
     * @Date 2021/12/22
     * @Time 12:50
     * @Description 开始备份文件
     * @throws \Exception
     */
    public function import($time = 0, $part = null, $start = null)
    {
        $db= new Backup();
        if(is_numeric($time) && is_null($part) && is_null($start)){
            $list  = $db->getFile('timeverif',$time);
            if(is_array($list)){
                Session::set('backup_list', $list);
                return layuiJson(0,'初始化完成',array('part' => 1, 'start' => 0));
            }else{
                return layuiJson(1,'备份文件可能已经损坏，请检查！');
            }
        }else if(is_numeric($part) && is_numeric($start)){

            $list=Session::get('backup_list');

            $start= $db->setFile($list)->import($start,$time);

            if( false===$start){
                return layuiJson(1,'还原数据出错！');
            }elseif(0 === $start){
                if(isset($list[++$part])){
                    $data = array('part' => $part, 'start' => 0);
                    return layuiJson(0,"正在还原...#{$part}",$data);
                } else {
                    Session::delete('backup_list');
                    return layuiJson(0,'还原完成！');
                }
            }else{
                $data = array('part' => $part, 'start' => $start[0]);
                if($start[1]){
                    $rate = floor(100 * ($start[0] / $start[1]));
                    return layuiJson(0,"正在还原...#{$part} ({$rate}%)",$data);
                } else {
                    $data['gz'] = 1;
                    return layuiJson(0,"正在还原...#{$part}", '', $data);
                }
            }
        }else{
            return layuiJson(1,'参数错误！');
        }
    }
    /**
     * 删除备份文件
     */
    public function del($time = 0){
        $db= new Backup();
        if($db->delFile($time)){
            return layuiJson(0,'备份文件删除成功！');
        }else{
            return layuiJson(1,'备份文件删除失败，请检查权限！');
        }
    }
    /**
     * 下载备份文件
     */
    public function down($time = 0){
        $db= new Backup();
        $db->downloadFile($time);
    }

    //备份表
    public function export(Request $request)
    {
        $db= new Backup();
        if($request->isPost()){
            $input=input('post.');

            $fileinfo  =$db->getFile();
            //检查是否有正在执行的任务
            $lock = "{$fileinfo['filepath']}backup.lock";
            if(is_file($lock)){
                return layuiJson(0,'检测到有一个备份任务正在执行，请稍后再试！');
            } else {
                //创建锁文件
                file_put_contents($lock,time());
            }
            // 检查备份目录是否可写
            if(!is_writeable($fileinfo['filepath'])){
                return layuiJson(1,'备份目录不存在或不可写，请检查后重试！');
            }

            //缓存锁文件
            Session::set('lock', $lock);
            //缓存备份文件信息
            Session::set('backup_file', $fileinfo['file']);
            //缓存要备份的表
            Session::set('backup_tables', $input['tables']);
            //创建备份文件
            if(false !== $db->Backup_Init()){
                return layuiJson(0,'初始化成功！',['tab'=>['id' => 0, 'start' => 0]]);
            }else{
                return layuiJson(1,'初始化失败，备份文件创建失败！');
            }
        }else if($request->isGet()){
            $tables =  Session::get('backup_tables');
            $file=Session::get('backup_file');

            $id=input('id');
            $start=input('start');
            $start= $db->setFile($file)->backup($tables[$id], $start);
            if(false === $start){
                return layuiJson(1,'备份出错！');
            }else if(0 === $start){
                if(isset($tables[++$id])){
                    $tab = array('id' => $id, 'start' => 0);
                    return layuiJson(0,'备份完成！',array('tab' => $tab));
                } else { //备份完成，清空缓存
                    unlink(Session::get('lock'));
                    Session::delete('backup_tables');
                    Session::delete('backup_file');
                    return layuiJson(0,'备份完成！');
                }
            }
        }else{
            return layuiJson(1,'参数错误！');
        }
    }

    //修复表
    public function repair($tables= null)
    {
        $db= new Backup();
        if($db->repair($tables)){
            return layuiJson(0,'数据表修复完成！');
        }else{
            return layuiJson(1,'数据表修复出错请重试！');
        }
    }
    //优化表
    public function optimize($tables= null)
    {
        $db= new Backup();
        if($db->optimize($tables)){
            return layuiJson(0,'数据表优化完成！');
        }else{
            return layuiJson(1,'数据表优化出错请重试！');
        }
    }
}